#ifndef THREADLAUNCHER_H_
#define THREADLAUNCHER_H_

#include <boost/thread.hpp>

#include "./Runnable.h"

namespace Core {
namespace ThreadManagement {

/* Klasa pozwalajaca w latwy sposob uruchamiac nowe watki na podstawie okreslonej klasy
 * bedacej pochodna klasy Runnable. */
class ThreadLauncher {
protected:
	Runnable* thread_entry_point_;
	/* Uchwyt watku. */
	boost::thread* thread_handle_;
	/* Zapewnia punkt wejscia watku potomnego. */
	class ThreadRunner {
		Runnable* thread_;
	public:
		ThreadRunner(Runnable* thread):
			thread_( thread )
		{}
		void operator()();
	}; //class TaskThreadRunner
public:
	/* Tworzy obiekt zarzadzajacy watkiem, ktorego punkt wejscia okreslony jest w klasie thread_entry_point. */
	ThreadLauncher( Runnable* thread_entry_point ):
		thread_entry_point_( thread_entry_point ),
		thread_handle_( 0 )
	{}
	/* Destruktor. Odczepia watek. */
	virtual ~ThreadLauncher();
	/* Uruchamia watek. */
	void start();
};

} //namespace ThreadManagement
} //namespace Core

#endif /* THREADLAUNCHER_H_ */
